var delay_time = 1;
auto.waitFor()

// 将设备保持常亮
device.keepScreenDim();

// 本地存储数据
var storage = storages.create('data');
// 更新题库为answer_question_map1
storage.remove('answer_question_map');

delay_time = Number(delay_time) * 1000;

//请求横屏截图权限
threads.start(function() {
    try {
        var beginBtn;
        if (beginBtn = classNameContains("Button").textContains("开始").findOne(delay_time));
        else(beginBtn = classNameContains("Button").textContains("允许").findOne(delay_time));
        beginBtn.click();
    } catch (error) {}
});
requestScreenCapture(false);
sleep(delay_time);
/**
 * 定义HashTable类，用于存储本地题库，查找效率更高
 * 由于hamibot不支持存储自定义对象和new Map()，因此这里用列表存储自己实现
 * 在存储时，不需要存储整个question，可以仅根据选项来对应question，这样可以省去ocr题目的花费
 * 但如果遇到选项为special_problem数组中的模糊词，无法对应question，则需要存储整个问题
 */

var answer_question_map = [];

// 当题目为这些词时，题目较多会造成hash表上的一个index过多，此时存储其选项
var special_problem = '选择正确的读音 选择词语的正确词形 下列词形正确的是 根据《中华人民共和国'

/**
 * hash函数
 * 6469通过从3967到5591中的质数，算出的最优值，具体可以看评估代码
 */
function hash(string) {
    var hash = 0;
    for (var i = 0; i < string.length; i++) {
        hash += string.charCodeAt(i);
    }
    return hash % 6469;
}

// 存入
function map_set(key, value) {
    var index = hash(key);
    if (answer_question_map[index] === undefined) {
        answer_question_map[index] = [
            [key, value]
        ];
    } else {
        // 去重
        for (var i = 0; i < answer_question_map[index].length; i++) {
            if (answer_question_map[index][i][0] == key) {
                return null;
            }
        }
        answer_question_map[index].push([key, value]);
    }
};

// 取出
function map_get(key) {
    var index = hash(key);
    if (answer_question_map[index] != undefined) {
        for (var i = 0; i < answer_question_map[index].length; i++) {
            if (answer_question_map[index][i][0] == key) {
                return answer_question_map[index][i][1];
            }
        }
    }
    return null;
};

/**
 * 通过Http下载题库到本地，并进行处理，如果本地已经存在则无需下载
 */
if (!storage.contains('answer_question_map1')) {
    // 使用牛腾讯云云盘
    var answer_question_bank = http.get('https://xxqg-tiku-1305531293.cos.ap-nanjing.myqcloud.com/%E9%A2%98%E5%BA%93_%E6%8E%92%E5%BA%8F%E7%89%88.json')
    answer_question_bank = answer_question_bank.body.string();
    answer_question_bank = JSON.parse(answer_question_bank);

    for (var question in answer_question_bank) {
        var answer = answer_question_bank[question];
        if (special_problem.indexOf(question.slice(0, 7)) != -1) question = question.slice(question.indexOf('|') + 1);
        else {
            question = question.slice(0, question.indexOf('|'));
            question = question.slice(0, question.indexOf(' '));
            question = question.slice(0, 10);
        }
        map_set(question, answer);
    }

    storage.put('answer_question_map1', answer_question_map);
}

var answer_question_map = storage.get('answer_question_map1');


/**
 * 模拟点击不可以点击元素
 * @param {UiObject / string} target 控件或者是控件文本
 */
function my_click_non_clickable(target) {
    if (typeof(target) == 'string') {
        text(target).waitFor();
        var tmp = text(target).findOne().bounds();
    } else {
        var tmp = target.bounds();
    }
    var randomX = random(tmp.left, tmp.right);
    var randomY = random(tmp.top, tmp.bottom);
    click(randomX, randomY);
}

// 模拟点击可点击元素
function my_click_clickable(target) {
    text(target).waitFor();
    // 防止点到页面中其他有包含“我的”的控件，比如搜索栏
    if (target == '我的') {
        id("comm_head_xuexi_mine").findOne().click();
    } else {
        click(target);
    }
}

// 模拟随机时间
function random_time(time) {
    return time + random(100, 1000);
}

/**
 * 刷新页面
 * @param {boolean} orientation 方向标识 true表示从下至上 false表示从上至下
 */
function refresh(orientation) {
    if (orientation) swipe(device.width / 2, device.height * 13 / 15, device.width / 2, device.height * 2 / 15, random_time(delay_time / 2));
    else swipe(device.width / 2, device.height * 6 / 15, device.width / 2, device.height * 12 / 15, random_time(delay_time / 2));
    sleep(random_time(delay_time * 2));
}

/**
 * 推送通知到微信
 * @param {string} account 账号
 * @param {string} score 分数
 */
function push_weixin_message(account, score) {
    http.postJson(
        'http://www.pushplus.plus/send', {
            token: pushplus_token,
            title: '强国学习通知',
            content: '账号名' + account + '今日已经获得' + score + '分'
        }
    );
}

/**
 * 如果因为某种不知道的bug退出了界面，则使其回到正轨
 * 全局变量back_track_flag说明:
 * back_track_flag = 0时，表示阅读部分
 * back_track_flag = 1时，表示视听部分
 * back_track_flag = 2时，表示竞赛、答题部分和准备部分
 */
function back_track() {
    app.launchApp('学习强国');
    sleep(random_time(delay_time * 3));
    var while_count = 0;
    while (!id('comm_head_title').exists() && while_count < 5) {
        while_count++;
        back();
        sleep(random_time(delay_time));
    }
    switch (back_track_flag) {
        case 0:
            // 去中心模块
            id('home_bottom_tab_icon_large').waitFor();
            sleep(random_time(delay_time));
            var home_bottom = id('home_bottom_tab_icon_large').findOne().bounds();
            click(home_bottom.centerX(), home_bottom.centerY());
            // 去province模块
            className('adnroid.view.ViewGroup').depth(15).waitFor();
            sleep(random_time(delay_time));
            className('android.view.ViewGroup').depth(15).findOnce(2).child(3).click();
            break;
        case 1:
            break;
        case 2:
            my_click_clickable('我的');
            sleep(random_time(delay_time));
            my_click_clickable('学习积分');
            sleep(random_time(delay_time));
            text('登录').waitFor();
            break;
    }
}

/**
 * 获取各模块完成情况的列表、以及全局变量
 * 先获取有哪些模块还没有完成，并生成一个列表，其中第一个是我要选读文章模块，以此类推
 * 再获取阅读模块和视听模块已完成的时间和次数
 */
// 已阅读文章次数
var completed_read_count;
// 已观看视频次数
var completed_watch_count;

function get_finish_list() {
    var finish_list = [];
    for (var i = 4; i < 17; i++) {
        // 由于模拟器有model无法读取因此用try catch
        try {
            var model = className('android.view.View').depth(22).findOnce(i);
            if (i == 4) {
                completed_read_count = parseInt(model.child(2).text().match(/\d+/)) / 2;
            } else if (i == 5) {
                completed_watch_count = parseInt(model.child(2).text().match(/\d+/));
            } else if (i == 8) {
                weekly_answer_scored = parseInt(model.child(2).text().match(/\d+/));
            } else if (i == 9) {
                special_answer_scored = parseInt(model.child(2).text().match(/\d+/));
            } else if (i == 11) {
                four_players_scored = parseInt(model.child(2).text().match(/\d+/));
            } else if (i == 12) {
                two_players_scored = parseInt(model.child(2).text().match(/\d+/));
            }
            finish_list.push(model.child(3).text() == '已完成');
        } catch (error) {
            finish_list.push(false);
        }
    }
    return finish_list;
}
/*
 *********************准备部分********************
 */

var back_track_flag = 2;
back_track();
var finish_list = get_finish_list();

// 返回首页
className('android.view.View').clickable(true).depth(21).findOne().click();
id('my_back').waitFor();
sleep(random_time(delay_time / 2));
id('my_back').findOne().click();

// 去province模块
sleep(random_time(delay_time));
className('android.view.ViewGroup').depth(15).waitFor();
sleep(random_time(delay_time));
className('android.view.ViewGroup').depth(15).findOnce(2).child(3).click();

/*
 **********本地频道*********
 */
if (!finish_list[12]) {
    className('android.widget.LinearLayout').clickable(true).depth(26).waitFor();
    sleep(random_time(delay_time));
    className('android.widget.LinearLayout').clickable(true).depth(26).findOne().click();
    sleep(random_time(delay_time));
    back();
}


/*
 *********************阅读部分********************
 */

// 把音乐暂停
media.pauseMusic();
var back_track_flag = 0;

/*
 **********我要选读文章与分享与广播学习*********
 */

// 打开电台广播
if (!finish_list[2] && !finish_list[0]) {
    sleep(random_time(delay_time));
    my_click_clickable('电台');
    sleep(random_time(delay_time));
    my_click_clickable('听广播');
    sleep(random_time(delay_time));
    id("lay_state_icon").waitFor();
    var lay_state_icon_pos = id("lay_state_icon").findOne().bounds();
    click(lay_state_icon_pos.centerX(), lay_state_icon_pos.centerY());

    sleep(random_time(delay_time));
    var home_bottom = id('home_bottom_tab_icon_large').findOne().bounds();
    click(home_bottom.centerX(), home_bottom.centerY());
}

// 阅读文章次数
var count = 1;//文章次数

while ((count < 6 - completed_read_count) && !finish_list[0]) {

    if (!id('comm_head_title').exists() || !className('android.widget.TextView').depth(27).text('切换地区').exists()) back_track();
    sleep(random_time(delay_time));

    refresh(false);

    var article = id('general_card_image_id').find();

    if (article.length == 0) {
        refresh(false);
        continue;
    }

    for (var i = 0; i < article.length; i++) {

        sleep(random_time(500));

        try {
            click(article[i].bounds().centerX(),
                article[i].bounds().centerY());
        } catch (error) {
            continue;
        }

        sleep(random_time(delay_time));
        // 跳过专栏与音乐
        if (className("ImageView").depth(10).clickable(true).findOnce(1) == null ||
            textContains("专题").findOne(1000) != null) {
            back();
            continue;
        }

        // 观看时长
        sleep(random_time(65000));

        back();
        count++;
    }
    sleep(random_time(500));
}

/*
 *********************视听部分********************
 */

// 关闭电台广播
if (!finish_list[2] && !finish_list[0]) {
    sleep(random_time(delay_time));
    my_click_clickable('电台');
    sleep(random_time(delay_time));
    my_click_clickable('听广播');
    sleep(random_time(delay_time));
    className('android.widget.ImageView').clickable(true).id('v_playing').waitFor();
    className('android.widget.ImageView').clickable(true).id('v_playing').findOne().click();
    // 获取新的完成情况列表
    sleep(random_time(delay_time));
    var back_track_flag = 2;
    back_track();
    var finish_list = get_finish_list();
}

back_track_flag = 1;

/*
 **********视听学习、听学习时长*********
 */
if (!finish_list[1] || !finish_list[2]) {
    if (!id('comm_head_title').exists()) back_track();
    my_click_clickable('百灵');
    sleep(random_time(delay_time / 2));
    my_click_clickable('竖');
    // 等待视频加载
    sleep(random_time(delay_time * 3));
    // 点击第一个视频
    className('android.widget.FrameLayout').clickable(true).depth(24).findOne().click();

    // 为了兼容强国版本为v2.32.0
    sleep(random_time(delay_time));
    if (!id('iv_back').exists()) {
        className('android.widget.FrameLayout').clickable(true).depth(24).findOnce(7).click();
    }

    sleep(random_time(delay_time));
    if (text('继续播放').exists()) click('继续播放');
    if (text('刷新重试').exists()) click('刷新重试');

    while (completed_watch_count < 6) {
        sleep(random_time(delay_time / 2));
        className('android.widget.LinearLayout').clickable(true).depth(16).waitFor();
        // 当前视频的时间长度
        try {
            var current_video_time = className('android.widget.TextView').clickable(false).depth(16).findOne().text().match(/\/.*/).toString().slice(1);
            // 如果视频超过一分钟就跳过
            if (Number(current_video_time.slice(0, 3)) >= 1) {
                refresh(true);
                sleep(random_time(delay_time));
                continue;
            }
            sleep(Number(current_video_time.slice(4)) * 1000 + 500);
        } catch (error) {
            // 如果被"即将播放"将读取不到视频的时间长度，此时就sleep 3秒
            sleep(3000);
        }
        completed_watch_count++;
    }

    back();
}

// 过渡
my_click_clickable('我的');
sleep(random_time(delay_time / 2));
my_click_clickable('学习积分');
sleep(random_time(delay_time / 2));